package org.ee.core.util;


import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 字符串工具类
 * 主要功能
 *
 * 空值判断：
 *
 * isEmpty(String str): 判断字符串是否为空或 null。
 *
 * isNotEmpty(String str): 判断字符串是否不为空或 null。
 *
 * isBlank(String str): 判断字符串是否为空或只包含空格。
 *
 * isNotBlank(String str): 判断字符串是否不为空且不只包含空格。
 *
 * 去空格：
 *
 * trim(String str): 去除字符串两端的空格。
 *
 * removeSpaces(String str): 去除字符串中的所有空格。
 *
 * 大小写转换：
 *
 * toUpperCase(String str): 转换为大写。
 *
 * toLowerCase(String str): 转换为小写。
 *
 * capitalize(String str): 将字符串的首字母大写。
 *
 * decapitalize(String str): 将字符串的首字母小写。
 *
 * 字符串截取：
 *
 * substring(String str, int beginIndex, int endIndex): 截取字符串。
 *
 * 判断字符串格式：
 *
 * isNumeric(String str): 判断字符串是否为有效数字。
 *
 * isPositiveInteger(String str): 判断字符串是否为正整数。
 *
 * containsNumber(String str): 判断字符串是否包含数字。
 *
 * isValidEmail(String str): 判断字符串是否为有效的邮箱地址。
 *
 * isValidPhoneNumber(String str): 判断字符串是否为有效的手机号。
 *
 * 字符串反转：
 *
 * reverse(String str): 反转字符串。
 *
 * 连接字符串：
 *
 * join(String[] array, String delimiter): 将字符串数组连接为一个字符串，使用指定的分隔符。
 *
 * 字节长度：
 *
 * getByteLength(String str): 获取字符串的字节长度。
 *
 * 统计字符出现次数：
 *
 * countOccurrences(String str, char c): 统计字符在字符串中出现的次数。
 *
 * 字符串命名转换：
 *
 * toCamelCase(String str): 将字符串转换为驼峰命名格式。
 *
 * toSnakeCase(String str): 将驼峰命名转换为下划线命名。
 *
 * toTitleCase(String str): 将字符串转换为首字母大写的标题格式。
 * @Author jokr
 * @Date 2025/8/26 下午1:53
 */
public class StringUtil {

    // 判断字符串是否为空或 null
    public static boolean isEmpty(String str) {
        return str == null || str.trim().isEmpty();
    }

    // 判断字符串是否不为空或 null
    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }

    // 判断字符串是否为空，或者只包含空格
    public static boolean isBlank(String str) {
        return str == null || str.trim().isEmpty();
    }

    // 判断字符串是否不为空，且不只包含空格
    public static boolean isNotBlank(String str) {
        return !isBlank(str);
    }

    // 去除字符串两端的空格
    public static String trim(String str) {
        return str == null ? null : str.trim();
    }

    // 去除字符串中的所有空格
    public static String removeSpaces(String str) {
        return str == null ? null : str.replaceAll("\\s+", "");
    }

    // 字符串替换，替换所有的target字符为replacement字符
    public static String replace(String str, String target, String replacement) {
        if (str == null || target == null || replacement == null) {
            return str;
        }
        return str.replace(target, replacement);
    }

    // 字符串大写
    public static String toUpperCase(String str) {
        return str == null ? null : str.toUpperCase();
    }

    // 字符串小写
    public static String toLowerCase(String str) {
        return str == null ? null : str.toLowerCase();
    }

    // 字符串首字母大写
    public static String capitalize(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }

    // 字符串首字母小写
    public static String decapitalize(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        return str.substring(0, 1).toLowerCase() + str.substring(1);
    }

    // 字符串截取
    public static String substring(String str, int beginIndex, int endIndex) {
        if (str == null || beginIndex < 0 || endIndex > str.length() || beginIndex >= endIndex) {
            return null;
        }
        return str.substring(beginIndex, endIndex);
    }

    // 判断字符串是否为有效的数字
    public static boolean isNumeric(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        return str.matches("-?\\d+(\\.\\d+)?");
    }

    // 判断字符串是否为有效的正整数
    public static boolean isPositiveInteger(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        return str.matches("\\d+");
    }

    // 判断字符串是否包含数字
    public static boolean containsNumber(String str) {
        if (str == null) {
            return false;
        }
        return str.matches(".*\\d.*");
    }

    // 判断字符串是否为有效的邮箱地址
    public static boolean isValidEmail(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        String regex = "^[A-Za-z0-9+_.-]+@(.+)$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        return matcher.matches();
    }

    // 判断字符串是否为有效的手机号
    public static boolean isValidPhoneNumber(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        String regex = "^1[3-9]\\d{9}$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        return matcher.matches();
    }

    // 字符串反转
    public static String reverse(String str) {
        if (str == null) {
            return null;
        }
        return new StringBuilder(str).reverse().toString();
    }

    // 将字符串数组连接为单一字符串，使用指定的分隔符
    public static String join(String[] array, String delimiter) {
        if (array == null || array.length == 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < array.length; i++) {
            sb.append(array[i]);
            if (i < array.length - 1) {
                sb.append(delimiter);
            }
        }
        return sb.toString();
    }

    // 获取字符串的字节长度
    public static int getByteLength(String str) {
        if (str == null) {
            return 0;
        }
        return str.getBytes().length;
    }

    // 统计字符串中某个字符的出现次数
    public static int countOccurrences(String str, char c) {
        if (str == null) {
            return 0;
        }
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == c) {
                count++;
            }
        }
        return count;
    }

    // 将字符串转换为驼峰命名
    public static String toCamelCase(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        String[] parts = str.split("_");
        StringBuilder camelCaseString = new StringBuilder(parts[0].toLowerCase());
        for (int i = 1; i < parts.length; i++) {
            camelCaseString.append(parts[i].substring(0, 1).toUpperCase());
            camelCaseString.append(parts[i].substring(1).toLowerCase());
        }
        return camelCaseString.toString();
    }

    // 将驼峰命名转换为下划线命名
    public static String toSnakeCase(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        StringBuilder snakeCaseString = new StringBuilder();
        char[] chars = str.toCharArray();
        for (char c : chars) {
            if (Character.isUpperCase(c)) {
                snakeCaseString.append("_").append(Character.toLowerCase(c));
            } else {
                snakeCaseString.append(c);
            }
        }
        return snakeCaseString.toString();
    }

    // 将字符串转换为首字母大写的标题格式（例如：hello_world -> Hello World）
    public static String toTitleCase(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        String[] words = str.split("_");
        StringBuilder titleCaseString = new StringBuilder();
        for (String word : words) {
            if (!word.isEmpty()) {
                titleCaseString.append(word.substring(0, 1).toUpperCase());
                titleCaseString.append(word.substring(1).toLowerCase());
                titleCaseString.append(" ");
            }
        }
        return titleCaseString.toString().trim();
    }
}
